package com.kun.ocr;

import com.baidu.aip.ocr.AipOcr;
import com.kun.util.FileUtil;
import org.json.JSONObject;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;

/**
 * Created by admin on 2017/8/4.
 * 识别图片中的文字
 */
public class ORCUtil {

    //设置APPID/AK/SK
    public static final String APP_ID = "9969905";
    public static final String API_KEY = "I1Gfy8jMoXGZMifPePewuDwq";
    public static final String SECRET_KEY = "AA2iAbmNVszDReIk3sBfQNm2jdMMxS80";

    private static AipOcr client = null;

    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = new FileInputStream("D:/timg.jpg");
        JSONObject jsonObject = ORCUtil.getIdCardText(FileUtil.stream2byte(fileInputStream), "front", null);
        System.out.println(jsonObject.toString());
    }

    /**
     * 获取图像识别客户端
     *
     * @return
     */
    public static AipOcr creatClient() {
        if (client == null) {
            client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
            // 可选：设置网络连接参数
            client.setConnectionTimeoutInMillis(5000);
            client.setSocketTimeoutInMillis(60000);
        }
        return client;
    }

    /**
     * 通用图片文字识别
     *
     * @param file  图片byte[]
     * @param param 可选参数
     *              param 列表:
     *              language_type 识别语言类型，默认为CHN_ENG。可选值包括：<br>- CHN_ENG：中英文混合；<br>- ENG：英文；<br>- POR：葡萄牙语；<br>- FRE：法语；<br>- GER：德语；<br>- ITA：意大利语；<br>- SPA：西班牙语；<br>- RUS：俄语；<br>- JAP：日语；<br>- KOR：韩语；
     *              detect_direction 是否检测图像朝向，默认不检测，即：false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:<br>- true：检测朝向；<br>- false：不检测朝向。
     *              detect_language 是否检测语言，默认不检测。当前支持（中文、英语、日语、韩语）
     *              probability 是否返回识别结果中每一行的置信度
     * @return
     */
    public static JSONObject getText(byte[] file, HashMap<String, String> param) {
        return creatClient().basicGeneral(file, validateParam(param));
    }

    /**
     * 通用图片文字识别(包含生僻字)
     * 注意:该方法要百度API开放(要花钱...)
     *
     * @param file  图片byte[]
     * @param param 可选参数
     *              param 列表:
     *              language_type 识别语言类型，默认为CHN_ENG。可选值包括：<br>- CHN_ENG：中英文混合；<br>- ENG：英文；<br>- POR：葡萄牙语；<br>- FRE：法语；<br>- GER：德语；<br>- ITA：意大利语；<br>- SPA：西班牙语；<br>- RUS：俄语；<br>- JAP：日语；<br>- KOR：韩语；
     *              detect_direction 是否检测图像朝向，默认不检测，即：false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:<br>- true：检测朝向；<br>- false：不检测朝向。
     *              detect_language 是否检测语言，默认不检测。当前支持（中文、英语、日语、韩语）
     *              probability 是否返回识别结果中每一行的置信度
     * @return
     */
    public static JSONObject getEnhancedText(byte[] file, HashMap<String, String> param) {
        return creatClient().enhancedGeneral(file, validateParam(param));
    }

    /**
     * 通用图片文字识别(高精度识别,包含位置信息)
     *
     * @param file  图片byte[]
     * @param param 可选参数
     *              param列表:
     *              recognize_granularity 是否定位单字符位置，big：不定位单字符位置，默认值；small：定位单字符位置
     *              detect_direction 是否检测图像朝向，默认不检测，即：false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:<br>- true：检测朝向；<br>- false：不检测朝向。
     *              vertexes_location 是否返回文字外接多边形顶点位置，不支持单字位置。默认为false
     *              probability 是否返回识别结果中每一行的置信度
     * @return
     */
    public static JSONObject getAccurateText(byte[] file, HashMap<String, String> param) {
        return creatClient().accurateGeneral(file, validateParam(param));
    }

    /**
     * 银行卡号识别
     *
     * @param file  图片byte[]
     * @param param 可选参数
     * @return
     */
    public static JSONObject getBankCardText(byte[] file, HashMap<String, String> param) {
        return creatClient().bankcard(file, validateParam(param));
    }

    /**
     * 验证参数
     *
     * @param param
     * @return
     */
    private static HashMap<String, String> validateParam(HashMap<String, String> param) {
        return param == null ? new HashMap<String, String>() : param;
    }

    /**
     * 身份证识别
     *
     * @param file       图片byte[]
     * @param idCardSide - front：身份证正面；back：身份证背面
     * @param param      可选参数
     *                   param 列表:
     *                   detect_direction 是否检测图像朝向，默认不检测，即：false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:<br>- true：检测朝向；<br>- false：不检测朝向。
     *                   detect_risk 是否开启身份证风险类型(身份证复印件、临时身份证、身份证翻拍、修改过的身份证)功能，默认不开启，即：false。可选值:true-开启；false-不开启
     * @return
     */
    public static JSONObject getIdCardText(byte[] file, String idCardSide, HashMap<String, String> param) {
        return creatClient().idcard(file, idCardSide, validateParam(param));
    }

    /**
     * 行驶证识别
     *
     * @param file  图片byte[]
     * @param param 可选参数
     *              param 列表:
     *              detect_direction 是否检测图像朝向，默认不检测，即：false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:<br>- true：检测朝向；<br>- false：不检测朝向。
     *              accuracy normal 使用快速服务，1200ms左右时延；缺省或其它值使用高精度服务，1600ms左右时延
     * @return
     */
    public static JSONObject getVehicleLicenseText(byte[] file, HashMap<String, String> param) {
        return creatClient().vehicleLicense(file, validateParam(param));
    }

    /**
     * 驾驶证识别
     *
     * @param file  图片byte[]
     * @param param 可选参数
     *              param 列表:
     *              detect_direction 是否检测图像朝向，默认不检测，即：false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:<br>- true：检测朝向；<br>- false：不检测朝向。
     * @return
     */
    public static JSONObject getDrivingLicenseText(byte[] file, HashMap<String, String> param) {
        return creatClient().drivingLicense(file, validateParam(param));
    }

    /**
     * 车牌号识别
     *
     * @param file  图片byte[]
     * @param param 可选参数
     *              param 列表:
     *              multi_detect 是否检测多张车牌，默认为false，当置为true的时候可以对一张图片内的多张车牌进行识别
     * @return
     */
    public static JSONObject getPlateLicenseText(byte[] file, HashMap<String, String> param) {
        return creatClient().plateLicense(file, validateParam(param));
    }

}
